/**
 * Created with webstrom
 * author:金海宾
 * Date:2017/9/5
 * Time:16:53
 */
import axios from 'axios';
import qs from 'qs';
import {Message} from 'element-ui';
import utils from './utils';
import $ from 'jquery';
import proxyTable from '../../proxMap/index';

// 获取站点配置文件
const SITE_CONFIG = utils.getConfig();
let siteConfig = utils.getConfig();
let ERROR_MSG = {
    226: '验证码错误',
    402: '此账号已被停用'
};
let token = '';

/**
 * 对响应进行统一处理
 * @param res
 */
function responseFilter(res) {
    if (res.status === 200) {
        return res;
    }
    if (res.status === 223) {
        res.data = [];
        return res;
    }
    if (res.status === 230) {
        utils.toLogin();
        return false;
    }
    Message({
        message: ERROR_MSG[res.status] || res.message || '未知错误',
        type: 'warning'
    });
    return false;
}

// 扩展axios配置
axios.defaults = Object.assign(axios.defaults, {
    baseURL: SITE_CONFIG.server,
    paramsSerializer(param) {
        return qs.stringify(param);
    },
    headers: {
        post: {
            'Content-Type': 'application/json'
        }
    },
    timeout: 60000,
    responsetype: 'json'
});
// ajax请求拦截器
axios.interceptors.request.use((config) => {
    // 在发送请求之前做某件事
    /* if (config.method === 'post' && config.data) {
           var data = config.data;
           config.data = qs.stringify(data);
       }*/
    // 对请求地址进行处理，在有接口文档但是没有实际接口的时候用于获取测试数据
    return proxy(config);
}, (error) => {
    return Promise.reject(error);
});
// 请求响应拦截器
axios.interceptors.response.use((res) => {
    // 对响应进行拦截处理
    let respData = responseFilter(res.data);
    if (respData) {
        return respData;
    } else {
        return Promise.reject(res.data);
    }
}, (error) => {
    Message({
        message: error.message,
        type: 'error'
    });
    return Promise.reject(error);
});

/**
 * 代理地址列表
 * @param config
 */
function proxy(config) {
    let baseUrl = config.baseURL, url = config.url;
    // 获取请求的资源地址
    url = url.replace(baseUrl, '');
    // 判断映射测试数据是否存在
    let mockUrl = proxyTable[url];
    if (mockUrl) {
        config = Object.assign(config, {
            baseURL: SITE_CONFIG.mock,
            method: 'get',
            url: mockUrl + '?random=' + Math.random()
        });
    }
    return config;
}


// 全局公用请求
let commonAjaxMap = {
    queryProduct: 'productInfo/getProductcodeAndName'
};
for (let interfaceName in commonAjaxMap) {
    axios[interfaceName] = function (param) {
        return axios.post(commonAjaxMap[interfaceName], param || {});
    };
}
// 更新token
axios.updateToken = function (t) {
    token = t;
    sessionStorage.setItem('token', token);
};
axios.responseHandler = responseFilter;
export default axios;
